Linux I/O复用 epoll

您所在的位置:网站首页 epoll 头文件 Linux I/O复用 epoll

Linux I/O复用 epoll

2024-07-03 17:49| 来源: 网络整理| 查看: 265

http://www.cnblogs.com/zhangchaoyang/articles/2681893.html

首先看个结构体

复制代码 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ } 复制代码

struct epoll_event的成员events是个bit set,有几种类型:

EPOLLIN:关联的文件是用来读的

EPOLLOUT:关联的文件是用来写的

EPOLLET:Edge Trigger,与之对应的是Level Trigger,下面会详细介绍它们的区别。需要注意的是Level Trigger是默认模式,在我这边(linux-2.6.32)头文件sys/epoll.h中已经没有EPOLLLT的定义了,所以在代码中不要再显式地写EPOLLLT了,反正默认情况用的就是它。select和poll都相当于epoll中的Level Trigger模式。

定义两个变量,后面会用。

struct epoll_event  event, events[20];

epoll系列有3组函数:

int  epfd=epoll_create(int size);    //创建一个epoll实例。size表示建议内核开辟的空间。int nfds=epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);    //准备好读/写的事件存放在参数events中,maxevents是同时监听的最大事件数,timeout是超时返回。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);      //op的取值有:EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DEL,表示你要从监听集中添加、去除或修改某个文件描述符。

看个例子就知道该怎么用了:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #include #include #include #include #include #include #include #include #include #include   #define MAXLINE 5 #define OPEN_MAX 100 #define LISTENQ 20 #define SERV_PORT 5000 #define INFTIM 1000   int main(){      int i,maxi,listenfd,connfd,sockfd,epfd,nfds;      int n;      int yes=1;      char line[MAXLINE+1];      socklen_t clilen;      //声明epoll_event结构体变量,ev用于注册事件,数组用于回传要处理的事件      struct epoll_event ev,events[20];      //生成用于处理accept的epoll专用文件描述符      epfd=epoll_create(256);      struct sockaddr_in serveraddr;      struct sockaddr_in clientaddr;      listenfd=socket(PF_INET,SOCK_STREAM,0);      //设置套接口选项      setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&yes, sizeof ( int ));      //设置与要处理的事件相关的文件描述符      ev.data.fd=listenfd;      //设置要处理的事件类型      ev.events=EPOLLET|EPOLLIN;      //注册epoll事件      epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);        bzero(&serveraddr, sizeof (serveraddr));      serveraddr.sin_family=AF_INET;      char *local_addr= "127.0.0.1" ;      inet_pton(AF_INET,local_addr,&(serveraddr.sin_addr));      serveraddr.sin_port=htons(SERV_PORT);      bind(listenfd,( struct sockaddr*)&serveraddr, sizeof (serveraddr));      listen(listenfd,LISTENQ);      maxi=0;      while (1){          //等待epoll事件的发生          nfds=epoll_wait(epfd,events,20,500);          //处理所发生的事件          for (i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3